/** * Abiquo community edition * cloud management application for hybrid clouds * Copyright (C) 2008-2010 - Abiquo Holdings S.L. * * This application is free software; you can redistribute it and/or * modify it under the terms of the GNU LESSER GENERAL PUBLIC * LICENSE as published by the Free Software Foundation under * version 3 of the License * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * LESSER GENERAL PUBLIC LICENSE v.3 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package com.abiquo.vsm.resource; import static com.abiquo.vsm.resource.ResourceUtils.decodeParameter; import java.util.HashSet; import java.util.Set; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response.Status; import org.apache.wink.common.annotations.Workspace; import com.abiquo.vsm.VSMService; import com.abiquo.vsm.exception.VSMException; import com.abiquo.vsm.model.VirtualMachine; import com.abiquo.vsm.model.transport.VirtualMachineDto; import com.abiquo.vsm.model.transport.VirtualMachinesDto; import com.abiquo.vsm.redis.dao.RedisDao; import com.abiquo.vsm.redis.dao.RedisDaoFactory; /** * Resource with information about virtual machine subscriptions. * * @author ibarrera */ @Path(SubscriptionResource.SUBSCRIPTIONS_PATH) @Workspace(workspaceTitle = "Abiquo VSM workspace", collectionTitle = "Subscriptions") public class SubscriptionResource extends AbstractResource { /** The resource path. */ public static final String SUBSCRIPTIONS_PATH = "subscriptions"; /** The subscription parameter name. */ public static final String SUBSCRIPTION_PARAM = "subs"; /** The subscription path. */ public static final String SUBSCRIPTION_PATH = "{" + SUBSCRIPTION_PARAM + "}"; /** The query parameter used to specify the virtual machine name. */ private static final String VIRTUAL_MACHINE_NAME_QUERY_PARAM = "virtualmachine"; /** The VSM service. */ protected VSMService vsmService; /** The Redis DAO. */ private RedisDao dao; /** * Creates the resource. */ public SubscriptionResource() { vsmService = VSMService.getInstance(); dao = RedisDaoFactory.getInstance(); } /** * Get the list of subscriptions. * <p> * This method returns the list of all subscriptions, or the details of a single subscription if * the {@link #VIRTUAL_MACHINE_NAME_QUERY_PARAM} is specified. * * @return The list of monitored machines. */ @GET public VirtualMachinesDto getSubscriptions( @QueryParam(VIRTUAL_MACHINE_NAME_QUERY_PARAM) String virtualMachineName) { checkSystem(); Set<VirtualMachine> vms = null; if (virtualMachineName == null) { vms = dao.findAllVirtualMachines(); } else { virtualMachineName = decodeParameter(virtualMachineName); VirtualMachine vm = dao.findVirtualMachineByName(virtualMachineName); if (vm == null) { throw new VSMException(Status.NOT_FOUND, "There is no subscription for virtual machine " + virtualMachineName); } vms = new HashSet<VirtualMachine>(); vms.add(vm); } VirtualMachinesDto dto = new VirtualMachinesDto(); for (VirtualMachine vm : vms) { dto.add(toDto(vm)); } return dto; } /** * Subscribe to changes to the given virtual machine. * * @param virtualMachine The virtual machine to subscribe to. * @return The subscription details. */ @POST public VirtualMachineDto subscribe(VirtualMachineDto virtualMachine) { checkSystem(); VirtualMachine vm = vsmService.subscribe(virtualMachine.getPhysicalMachine().getAddress(), virtualMachine .getPhysicalMachine().getType(), virtualMachine.getName()); return toDto(vm); } /** * Unsubscribes from changes to the given virtual machine. * * @param subscriptionId The id of the virtual machine. */ @DELETE @Path(SUBSCRIPTION_PATH) public void unsubscribe(@PathParam(SUBSCRIPTION_PARAM) String subscriptionId) { checkSystem(); subscriptionId = decodeParameter(subscriptionId); VirtualMachine vm = dao.getVirtualMachine(Integer.valueOf(subscriptionId)); if (vm == null) { throw new VSMException(Status.NOT_FOUND, "There is no subscription with id " + subscriptionId); } vsmService.unsubscribe(vm.getPhysicalMachine().getAddress(), vm.getPhysicalMachine() .getType(), vm.getName()); } }